Ускоряем сборку Java-проектов: как мы сделали javac быстрее в Axiom JDK Express
Проблема: долгая сборка Java-проектов
Каждый Java-разработчик знает, сколько времени и ресурсов уходит на сборку Java-проектов. При использовании стандартных инструментов в разных проектах от 35% до 50% времени сборки тратится только на компиляцию. Но самое интересное — значительная часть этих затрат приходится не на саму компиляцию, а на “разогрев” виртуальной машины.
Дело в том, что javac — компилятор Java — сам написан на Java. Это значит, что сам javac запускается небыстро.
Наше решение: AOT-компиляция javac
Мы применили к javac (как к обычному Java-приложению) AOT-компиляцию (ahead-of-time, компиляция перед исполнением) с помощью Axiom NIK Pro — компилятора GraalVM с патчами от нашей компании. Так мы преобразовали байткод javac в нативный машинный код конкретной платформы, поэтому при запуске преобразованного приложения не тратится время на разогрев.
Каких результатов мы добились:
- Ускорили работу компилятора javac почти в 2 раза
 - Сократили общее время сборки проектов на 10-20%
 - Значительно снизили потребление CPU и памяти
 
Ускорение можно увидеть на графиках, полученных из снятых профилей производительности при компиляции модуля jdk.compiler.
Ниже вы увидите графики потребления CPU и памяти, где красным цветом показаны расход памяти и процессора оригинальным компилятором javac при компиляции собственных исходников, а зелёным – этот же компилятор, но уже после AOT.
График потребления CPU

Потребление памяти

Выводы
Мы исключили необходимость:
- Загрузки и инициализации JVM при каждом запуске javac
 - JIT-компиляции во время работы
 - Повторной загрузки одних и тех же классов
 
В результате наш компилятор запускается практически мгновенно и работает с максимальной эффективностью.
Как начать использовать наше решение?
Мы уже выложили Axiom JDK Express 21 с ускоренным javac. Скачать его можно в личном кабинете разработчика. Мы сделали интеграцию максимально простой, чтобы не пришлось переписывать код приложения.
Интеграция с Maven:
Добавьте в ваш pom.xml профиль:
<profile>
  <id>native_build</id>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.10.1</version>
        <configuration>
          <fork>true</fork>
          <executable>/путь/до/jdk/bin/javac</executable>
        </configuration>
      </plugin>
    </plugins>
  </build>
</profile>
Запускайте сборки так: mvn <target> -Pnative_build.
Интеграция с Gradle:
Создайте в проекте файл customjavac.gradle.kts со следующим содержимым:
allprojects {
  plugins.withId("java-base") {
    tasks.withType<JavaCompile>().configureEach {
      options.forkOptions.executable = "/путь/до/jdk/bin/javac"
      options.isFork = true
    }
  }
}
И запустите сборку: ./gradlew --init-script customjavac.gradle.kts <target>.
Почему стоит выбрать наше решение?
- Экономия времени — мы сокращаем время сборки на 10-20%, давая вам больше времени на разработку
 - Экономия ресурсов — наше решение потребляет меньше CPU и памяти, экономя вашу CI/CD-инфраструктуру
 - Простота внедрения — мы минимизировали изменения конфигурации для максимального результата
 - Наша поддержка — наши эксперты всегда готовы помочь с интеграцией и настройкой
 
Axiom JDK Express — это не просто ускоренный javac, а часть нашего комплексного решения для высокопроизводительной Java-разработки. Попробуйте уже сегодня и почувствуйте разницу!